package com.un.ebs.product.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.un.ebs.product.domain.*;
import com.un.ebs.product.dto.ProductSkuByUpdateDto;
import com.un.ebs.product.dto.ProductSkuVo;
import com.un.ebs.product.dto.SkuItemUpdateDto;
import com.un.ebs.product.enums.ProductBomTypeEnum;
import com.un.ebs.sys.dto.ObjectParentAndIndexChangeDto;

import java.util.List;

/**
 * <p>
 * 服务类
 * </p>
 *
 * @author liubo
 * @since 2019-09-16
 */
public interface ProductSkuService {

    void update(String id, String code, Double price, Boolean isVirtual, Boolean isPriceConfer);

    /**
     * 添加SKU到指定套餐中
     *
     * @param id
     * @param includeSkuId
     * @param qty
     */
    void addInclude(String id, String includeSkuId, Double qty, ProductBomTypeEnum bomType);

    void addIncludeByCode(String id, String skuCode, Double qty, ProductBomTypeEnum bomType);

    /**
     * 移除套餐中的项
     *
     * @param id
     */
    void removeInclude(String id);

    /**
     * 移动SKU中指定的套餐项
     *
     * @param id           Sku外键
     * @param includeSkuId 表的主健
     */
    void removeInclude(String id, String includeSkuId);

    /**
     * 修改套餐项在套餐中的数量
     *
     * @param id
     * @param qty
     */
    void updateIncludeQty(String id, Double qty);

    void updateSkuItem(SkuItemUpdateDto req);

    void updateSku(ProductSkuByUpdateDto req);

    void updateCostPrice(String skuId, Double costPrice);

    /**
     * 将SKU Item设置为是否允许缺件开工
     *
     * @param id
     */
    void updateLackStatus(String id, Boolean allowStatus);

    /**
     * 将SKU Item设置为是否允许缺件开工
     *
     * @param ids
     */
    void updateLackStatusByItemId(List<String> ids, Boolean allowStatus);

    /**
     * 删除 SKU
     *
     * @param id
     */
    void delete(String id);

    /**
     * 上架
     *
     * @param id
     */
    void upperShelf(String id);

    /**
     * 下架
     *
     * @param id
     */
    void lowerShelf(String id);

    /**
     * 在一个树形结构中，修改节点的父级对象ID和Index值。
     *
     * @param nodes
     */
    void changeNode(List<ObjectParentAndIndexChangeDto> nodes);

    /**
     * 查询SKU详情，视图模式
     *
     * @param id
     * @return
     */
    ProductSkuVo queryViewById(String id);

    /**
     * 查询SKu详情
     *
     * @param id
     * @return
     */
    ProductSku queryById(String id);

    /**
     * 根据SKU查询套餐成员
     *
     * @param id SKU ID
     * @return
     */
    List<ProductSkuItemExt> queryItemBySkuId(String id);

    IPage<ProductSkuItemExt> queryItemBySkuId(String id, ProductBomTypeEnum bomType, int pageSize, int pageIndex);

    /**
     * 根据套餐成员ID，查询定义
     *
     * @param id
     * @return
     */
    ProductSkuItemExt queryItemById(String id);

    /**
     * 查询SKU
     *
     * @param searchText
     * @param classId
     * @param productId
     * @param isCanSale
     * @param isMain
     * @param pageSize
     * @param pageIndex
     * @return
     */
    IPage<ProductSkuExt> query(String searchText, String classId, String productId, Boolean isCanSale, Boolean isMain, int pageSize, int pageIndex);

    /**
     * 查询所有商品
     *
     * @param searchText
     * @param pageSize
     * @param pageIndex
     * @return
     */
    IPage<ProductSkuExt> query(String searchText, int pageSize, int pageIndex);

    /**
     *
     * @param searchText
     * @param pageSize
     * @param pageIndex
     * @return
     */
    IPage<ProductBomExt> queryBom(String searchText, int pageSize, int pageIndex);

    List<ProductBomExt> queryBomBySku(String skuId);

    List<ProductBomExt> queryBomBySku(String skuId,ProductBomTypeEnum bomType);

    /**
     * 查询主营商品
     *
     * @param searchText
     * @param pageSize
     * @param pageIndex
     * @return
     */
    IPage<ProductSkuExt> queryByMain(String searchText, int pageSize, int pageIndex);

    /**
     * 查询副营商品
     *
     * @param searchText
     * @param pageSize
     * @param pageIndex
     * @return
     */
    IPage<ProductSkuExt> queryByOther(String searchText, int pageSize, int pageIndex);

    /**
     * 查询所有外采商品的供应商情况
     *
     * @param searchText
     * @param notSupply
     * @param pageSize
     * @param pageIndex
     * @return
     */
    IPage<ProductSkuPurchaseCountExt> queryPurchaseCount(String searchText, Boolean notSupply, int pageSize, int pageIndex);

    /**
     * 根据SPUID和商品SKU属性，查询SKU
     *
     * @param id
     * @param saleAttr
     * @return
     */
    ProductSkuVo queryBySaleAttr(String id, String saleAttr);

    /**
     * 查询SKU属性的时间表达式，一般服务类商品会配置此值，目前只支持时期周期类型的表达式，用于计划交付的开始与结束时间
     *
     * @param id
     * @return
     */
    String queryDeliverTimePeriodExpression(String id);

    /**
     * 二维码绑定
     *
     * @param id
     * @param qrcode
     */
    void bindQrcode(String id, String qrcode);

    ProductSkuVo queryByQrcode(String qrcode);

    /**
     * 已售墓位商品查询
     *
     * @param searchText
     * @param pageSize
     * @param pageIndex
     * @return
     */
    IPage<ProductSaleQueryByTomb> querySaleByTomb(String searchText, String classId, int pageSize, int pageIndex);

    IPage<SkuExt> querySku(String searchText, String classId, int pageSize, int pageIndex);

    IPage<ProductBomCostExt> queryBomCost(String skuCode, int pageSize, int pageIndex);

    IPage<ProductBomCostItemExt> queryBomItemCost(String skuId, String bomSkuCode, int pageSize, int pageIndex);
}
